// 你是一个专业的小偷，计划偷窃沿街的房屋，每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈，这意味着第一个房屋和最后一个房屋是紧挨着的。同时，相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。

// 给定一个代表每个房屋存放金额的非负整数数组，计算你在不触动警报装置的情况下，能够偷窃到的最高金额。

// 示例 1:

// 输入: [2,3,2]
// 输出: 3
// 解释: 你不能先偷窃 1 号房屋（金额 = 2），然后偷窃 3 号房屋（金额 = 2）, 因为他们是相邻的。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/house-robber-ii
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

// 与 打家劫舍1 相比 ，此题的房屋成了一个圈
// 因此必须要在 第一个 与 在后一个 舍弃一个
//最后取这两种情况的最好在值
class Solution {
public:
    
    int getValue(vector<int>& realyRobMaxMoney,int index)
    {
        if(index < 0 || index >= realyRobMaxMoney.size())
            return 0;
        return realyRobMaxMoney[index];
    }

    int robAsLine(vector<int>& nums,int l, int r) {
        if(r <l)
            return 0;
        vector<int> realyRobMaxMoney;
        if(nums.size()<=0)
            return 0;
        for (int i=0;i<r-l+1;i++)
        {
            realyRobMaxMoney.push_back(max(getValue(realyRobMaxMoney,i-2)+nums[i+l],getValue(realyRobMaxMoney,i-1))) ;
        }
        return realyRobMaxMoney[realyRobMaxMoney.size()-1];
    }

    int rob(vector<int>& nums) {
        if (nums.size() == 1) 
        {
            return nums[0];
        }
        int res1 = robAsLine(nums,1,nums.size()-1);
        int res2 = robAsLine(nums,0,nums.size()-2);
        return max(res1,res2);
    }
};